package com.yeung.swordoffer;

import java.util.ArrayList;

/**
 * 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字，例如，如果输入如下4 X 4矩阵：
 * 1 2 3 4
 * 5 6 7 8
 * 9 10 11 12
 * 13 14 15 16
 * 则依次打印出数字
 * 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
 */
public class 顺时针打印矩阵 {
    public static void main(String[] args) {

    }

    public static ArrayList<Integer> printMatrix(int[][] matrix) {
        if (matrix == null || matrix[0].length <= 0 || matrix.length <= 0) return null;
        ArrayList<Integer> list = new ArrayList<>();

        int width = matrix[0].length;
        int length = matrix.length;
        //只有一列的情况
        if (width == 1) {
            for (int i = 0; i < length; i++) {
                list.add(matrix[i][0]);
            }
        }
        //只有一行的情况
        if (length == 1) {
            for (int i = 0; i < width; i++) {
                list.add(matrix[0][i]);
            }
        }

        for (int layer = 0; layer < length - layer; layer++) {

            if (layer < width - layer) {
                //从左往右打印一行
                for (int i = layer; i < width - layer; i++) {
                    list.add(matrix[layer][i]);
                }
                //从上到下打印一列
                for (int i = layer + 1; i < length - layer; i++) {
                    list.add(matrix[i][width - layer - 1]);
                }


                int f = length - 1 - layer; //下边所在的行数
                //如果表达式为真, 那么表示打印到中心对称层(如5*5的矩阵),不用打印下边和左边的边
                if (f != layer) {
                    //从右往左打印一行
                    for (int i = width - 1 - 1 - layer; i >= layer; i--) {
                        list.add(matrix[length - 1 - layer][i]);

                    }
                    //从下到上打印一列
                    for (int i = length - 1 - 1 - layer; i > layer; i--) {
                        list.add(matrix[i][layer]);
                    }
                }
            }
        }

        return list;
    }

}
